#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {

    Mat image = imread("../../../src/cre/scripts/temp/image.jpg"); // 读取图像
    if (image.empty()) {
        cout << "Cannot read image file" << endl;
        return -1;
    }

    Mat smoothed;
    // 均值滤波
//    blur(image, smoothed, Size(3, 3)); // 进行均值滤波，卷积核大小为3x3
    // 中值滤波
//    medianBlur(image, smoothed, 3); // 进行中值滤波，卷积核大小为3x3
    // 高斯滤波
//    GaussianBlur(image, smoothed, Size(3, 3), 0); // 进行高斯滤波，卷积核大小为3x3，sigma为0
    // 双边滤波
//    bilateralFilter(image, smoothed, 9, 75, 75);// 进行双边滤波，d为卷积核大小，sigmaColor和sigmaSpace控制颜色值和空间值的权重
    // 形态学滤波
//    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 创建一个3x3的矩形结构元素
//    morphologyEx(image, smoothed, MORPH_OPEN, kernel); // 进行开运算
    // 拉普拉斯滤波
//    Mat gray, laplacian;
//    cvtColor(image, gray, COLOR_BGR2GRAY); // 将图像转换为灰度图像
//    Laplacian(gray, laplacian, CV_16S, 3); // 进行拉普拉斯滤波
//    convertScaleAbs(laplacian, smoothed); // 将拉普拉斯滤波结果转换为8位无符号整数
    // 高斯拉普拉斯滤波
//    Mat gray, blurred, laplacian;
//    cvtColor(image, gray, COLOR_BGR2GRAY); // 将图像转换为灰度图像
//    GaussianBlur(gray, blurred, Size(3, 3), 0); // 进行高斯模糊
//    Laplacian(blurred, laplacian, CV_16S, 3); // 进行拉普拉斯滤波
//    convertScaleAbs(laplacian, smoothed); // 将拉普拉斯滤波结果转换为8位无符号整数
    // Sobel 滤波
//    Mat gray, grad_x, grad_y, abs_grad_x, abs_grad_y;
//    cvtColor(image, gray, COLOR_BGR2GRAY); // 将图像转换为灰度图像
//    Sobel(gray, grad_x, CV_16S, 1, 0, 3); // 对x方向进行Sobel滤波
//    Sobel(gray, grad_y, CV_16S, 0, 1, 3); // 对y方向进行Sobel滤波
//    convertScaleAbs(grad_x, abs_grad_x); // 将x方向滤波结果转换为8位无符号整数
//    convertScaleAbs(grad_y, abs_grad_y); // 将y方向滤波结果转换为8位无符号整数
//    addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, smoothed); // 将两个方向的滤波结果合并
    // Canny 算子滤波
//    Mat gray;
//    cvtColor(image, gray, COLOR_BGR2GRAY); // 将图像转换为灰度图像
//    GaussianBlur(gray, gray, Size(3, 3), 0); // 进行高斯模糊
//    Canny(gray, smoothed, 100, 200); // 进行Canny滤波
    // 锐化滤波
    Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); // 创建锐化核
    filter2D(image, smoothed, -1, kernel); // 进行锐化滤波


    namedWindow("Original Image", WINDOW_NORMAL);
    namedWindow("Smoothed Image", WINDOW_NORMAL);

    imshow("Original Image", image);
    imshow("Smoothed Image", smoothed);

    waitKey(0);
    return 0;
}